package wawi.actions;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.validation.SkipValidation;

import wawi.db.DbConnector;
import wawi.util.Kategorie;
import wawi.util.Laden;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;

public class Artikel extends ActionSupport
{
	public Artikel()
	{		
		artNr = 0;		
		hersteller = "";
		textKurz = "";
		textLang = "";	
		preisEK = 0.0f;
		preisVK = 0.0f;
		farben_list = "";
		groessen_list = "";
		kalkulation = "";
		kategorie = Kategorie.NONE;
	}
	
	@SkipValidation
	public String neu()
	{		
		int startArtnNr = 1000;
		
		while (existsArtNr(startArtnNr))
			startArtnNr++;
		
		artNr = startArtnNr;
		
		System.out.println("Neuer Artikel");		
		return ActionSupport.INPUT;
	}
	
	public String speichern()
	{				
		if (isNeu())
		{
			if (!existsArtNr(artNr))
			{
				System.out.println("Write");
				if (DbConnector.getInstance().writeArtikel(this))	
				{
					//Artikel-Details erstellen
					if (generateArtikelDetails())
						return SUCCESS;
				}
			}
			else
			{
				addActionError("Artikelnummer bereits vergeben");
				return ERROR;
			}
		}
		else
		{
			System.out.println("Update");
			if (DbConnector.getInstance().updateArtikel(this))
			{				
				return SUCCESS;
			}
		}
		
		return ActionSupport.ERROR;
	}

	public boolean isNeu() {
		return DbConnector.getInstance().getArtikelWithNr(artNr) == null;
	}
	
	@SkipValidation
	public String bearbeiten()
	{
			
		HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
		
		try
		{
			int artNr = Integer.parseInt(request.getParameter("artnr"));
			
			if (DbConnector.getInstance().readArtikelWithNr(artNr, this))
				return ActionSupport.INPUT;		
		}
		catch (NumberFormatException nfe)
		{
			addActionError("Falsche ID");
		}
		
		return ERROR;
	}
		
	
	private boolean existsArtNr (int artNr)
	{
		return DbConnector.getInstance().getArtikelWithNr(artNr)!=null;
	}
	
	
	public List<ArtikelDetails> getDetailsListe()
	{
		return DbConnector.getInstance().getArtikelDetailsWithArtNr(artNr);
	}
	
	
	public boolean generateArtikelDetails()
	{
		String[] farben = farben_list.split("\n");
		String[] groessen = groessen_list.split("\n");
		
		for (int i=0; i<farben.length; i++)
		{
			for (int x=0; x<groessen.length; x++)
			{
				int ean = generateEAN();
				String farbe = farben[i].trim();
				String groesse = groessen[x].trim();
				
				if (farbe.length()<=0 || groesse.length()<=0)
					continue;
				
				ArtikelDetails neu = new ArtikelDetails();
				neu.setArtNr(artNr);
				neu.setEan(ean);
				neu.setFarbe(farbe);
				neu.setGroesse(groesse);
				
				System.out.println(neu);
				
				if (!DbConnector.getInstance().writeArtikelDetails(neu))
					return false;
			}
		}
		
		return true;
	}
	
	public static int generateEAN()
	{
		int val;
		
		do
		{
			val = (int) Math.abs(Math.random()*100000);
			System.out.println("Test EAN Value " + val);
		}
		while (DbConnector.getInstance().getArtikelDetailsWithEan(val)!=null || val>99999);
		
		return val;
	}
	
	
	
	
	
	private Integer artNr;	
	
	private String hersteller;
	private String textKurz;	
	private String textLang;	
	private String kalkulation;
	
	private float preisEK;
	private float preisVK;
	
	private String groessen_list;
	private String farben_list;

	private int kategorie;
	
	@RequiredFieldValidator(message="Art.-Nr. fehlt")
	public Integer getArtNr() {
		return artNr;
	}

	public void setArtNr(Integer artNr) {
		this.artNr = artNr;
	}


	@RequiredStringValidator(message="Hersteller fehlt")
	public String getHersteller() {
		return hersteller;
	}

	public void setHersteller(String hersteller) {
		this.hersteller = hersteller;
	}

	@RequiredStringValidator(message="Kurz-Text fehlt")
	public String getTextKurz() {
		return textKurz;
	}

	public void setTextKurz(String textKurz) {
		this.textKurz = textKurz;
	}

	public String getTextLang() {
		return textLang;
	}

	public void setTextLang(String textLang) {
		this.textLang = textLang;
	}



	@RequiredFieldValidator(message="EK-Preis fehlt")
	public float getPreisEK() {
		return preisEK;
	}


	public void setPreisEK(float preisEK) {
		this.preisEK = preisEK;
	}


	@RequiredFieldValidator(message="VK-Preis fehlt")
	public float getPreisVK() {
		return preisVK;
	}

	

	public int getKategorie() {
		return kategorie;
	}

	public void setKategorie(int kategorie) {
		this.kategorie = kategorie;
	}

	public void setPreisVK(float preisVK) {
		this.preisVK = preisVK;
	}

	public String getGroessen_list() {
		return groessen_list;
	}

	public void setGroessen_list(String groessen_list) {
		this.groessen_list = groessen_list;
	}

	public String getFarben_list() {
		return farben_list;
	}

	public void setFarben_list(String farben_list) {
		this.farben_list = farben_list;
	}

	public String getKalkulation() {
		return kalkulation;
	}

	public void setKalkulation(String kalkulation) {
		this.kalkulation = kalkulation;
	}
	
	
	public String getEtikettName()
	{
		String ret = getTextKurz();
		
		if (ret.length() > 29)
		{
			ret = ret.substring(0, 29-3);
			ret = ret + "...";
			return ret;
		}
		else
			return ret;
	}
	
	
	public int getGesamtBestand()
	{
		List<ArtikelDetails> details = this.getDetailsListe();
		int ret = 0;
		
		for (ArtikelDetails tmp : details)
		{
			ret += DbConnector.getInstance().bestandsabfrage(tmp.getEan(), Laden.EPPENDORF);
			ret += DbConnector.getInstance().bestandsabfrage(tmp.getEan(), Laden.WINTERHUDE);
			ret += DbConnector.getInstance().bestandsabfrage(tmp.getEan(), Laden.BLANKENSE);
		}
		
		return ret;
	}
	
	public Map<Integer, String> getKategorien()
	{
		return Kategorie.getKategorien();
	}
}
